package com.ld.common.util;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ld.shieldsb.common.core.collections.ListUtils;
import com.ld.shieldsb.common.core.io.FileUtils;
import com.ld.shieldsb.common.core.model.PropertiesModel;
import com.ld.shieldsb.common.core.util.JsoupUtil;
import com.ld.shieldsb.common.core.util.StringUtils;

public class EWeChatUtil {
    public static final String SEND_TO_ALL = "@all"; // 发送给所有人

    enum Type {
        /*  自定义机器人支持文本（text）、markdown（markdown）、图片（image）、图文（news）四种消息类型。
                                机器人的text/markdown类型消息支持在content中使用<@userid>扩展语法来@群成员     */

        /*文本*/TEXT("text"), MARKDOWN("markdown"), IMAGE("image"), /*图文*/ NEWS("news"), /*文件*/FILE("file");

        private final String value;

        Type(final String val) {
            this.value = val;
        }

        public String getValue() {
            return this.value;
        }

    }

    /**
     * 转换为文本消息的map
     * 
     * @Title parse2TextDataMap
     * @author 吕凯
     * @date 2020年7月3日 上午9:27:26
     * @param content
     *            内容，支持@某个人
     * @return Map<String,Object>
     */
    public static final Map<String, Object> parse2TextDataMap(String content) {
        return parse2TextDataMap(content, null, null, false);
    }

    public static final Map<String, Object> parse2TextDataMap(String content, List<String> noticeIds, List<String> noticeMobiles) {
        return parse2TextDataMap(content, noticeIds, noticeMobiles, false);
    }

    public static final Map<String, Object> parse2TextDataMap(String content, boolean noticeAll) {
        return parse2TextDataMap(content, null, null, noticeAll);
    }

    /**
     * 
     * 转换为文本消息的map
     * 
     * @author 吕凯
     * @date 2020年7月6日 下午4:55:10
     * @param content
     * @param noticeIds
     *            用户id，需要查看，不是姓名，多个用户用,连接
     * @param noticeMobiles
     *            用户手机号，多个用户用,连接
     * @return Map<String,Object>
     */
    public static final Map<String, Object> parse2TextDataMap(String content, String noticeIds, String noticeMobiles) {
        return parse2TextDataMap(content, noticeIds == null ? null : Arrays.asList(noticeIds.split(",")),
                noticeMobiles == null ? null : Arrays.asList(noticeMobiles.split(",")), false);
    }

    /**
     * 
     * 转换为文本消息的map
     * 
     * @Title parse2TextDataMap
     * @author 吕凯
     * @date 2020年7月6日 下午4:54:33
     * @param content
     * @param noticeIds
     *            用户id，需要查看，不是姓名
     * @param noticeMobiles
     *            用户手机号
     * @param noticeAll
     * @return Map<String,Object>
     */
    public static final Map<String, Object> parse2TextDataMap(String content, List<String> noticeIds, List<String> noticeMobiles,
            boolean noticeAll) {
        /*{
            "msgtype": "text",
            "text": {
                "content": "hello world"
            }
        }*/
        /*{
            "msgtype": "text",
            "text": {
                "content": "广州今日天气：29度，大部分多云，降雨概率：60%",
                "mentioned_list":["wangqing","@all"],
                "mentioned_mobile_list":["13800001111","@all"]
            }
        }*/
        /*msgtype   是   消息类型，此时固定为text
        content 是   文本内容，最长不超过2048个字节，必须是utf8编码
        mentioned_list  否   userid的列表，提醒群中的指定成员(@某个成员)，@all表示提醒所有人，如果开发者获取不到userid，可以使用mentioned_mobile_list
        mentioned_mobile_list   否   手机号列表，提醒手机号对应的群成员(@某个成员)，@all表示提醒所有人*/

        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("msgtype", Type.TEXT.value);
        Map<String, Object> dataTextMap = new HashMap<>();
        dataTextMap.put("content", content);
        if (ListUtils.isNotEmpty(noticeIds)) {
            dataTextMap.put("mentioned_list", noticeIds.toArray());
        }
        if (ListUtils.isNotEmpty(noticeMobiles)) {
            dataTextMap.put("mentioned_mobile_list", noticeMobiles.toArray());
        }
        if (noticeAll) { // 通知全部
            if (ListUtils.isNotEmpty(noticeIds)) {
                noticeIds.add(SEND_TO_ALL);
                dataTextMap.put("mentioned_list", noticeIds);
            }
            if (ListUtils.isNotEmpty(noticeMobiles)) {
                noticeMobiles.add(SEND_TO_ALL);
                dataTextMap.put("mentioned_list", noticeMobiles);
            }
            if (ListUtils.isEmpty(noticeIds) && ListUtils.isEmpty(noticeMobiles)) {
                noticeIds = new ArrayList<>();
                noticeIds.add(SEND_TO_ALL);
                dataTextMap.put("mentioned_list", noticeIds);
            }
        }
        dataMap.put(Type.TEXT.value, dataTextMap);
        return dataMap;
    }

    /**
     * 
     * 转换为图文消息的map
     * 
     * @Title parse2NewsDataMap
     * @author 吕凯
     * @date 2020年7月7日 上午8:21:09
     * @param title
     *            标题
     * @param description
     *            描述
     * @param url
     *            点击调整链接
     * @param picurl
     *            图片链接
     * @return Map<String,Object>
     */
    public static final Map<String, Object> parse2NewsDataMap(String title, String description, String url, String picurl) {
        /*{
            "msgtype": "news",
            "news": {
               "articles" : [
                   {
                       "title" : "中秋节礼品领取",
                       "description" : "今年中秋节公司有豪礼相送",
                       "url" : "www.qq.com",
                       "picurl" : "http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png"
                   }
                ]
            }
        }*/
        /*msgtype 是   消息类型，此时固定为news
        articles    是   图文消息，一个图文消息支持1到8条图文
        title   是   标题，不超过128个字节，超过会自动截断
        description 否   描述，不超过512个字节，超过会自动截断
        url 是   点击后跳转的链接。
        picurl  否   图文消息的图片链接，支持JPG、PNG格式，较好的效果为大图 1068*455，小图150*150。*/

        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("msgtype", "news");

        Map<String, List<Map<String, String>>> dataNewsMap = new HashMap<>();
        List<Map<String, String>> newsArtiList = new ArrayList<>();
        Map<String, String> dataTextMap = new HashMap<>();
        dataTextMap.put("title", title);
        if (StringUtils.isNotEmpty(description)) {
            dataTextMap.put("description", description);
        }
        dataTextMap.put("url", url); // 必须有
        dataTextMap.put("picurl", picurl);

        newsArtiList.add(dataTextMap);

        dataNewsMap.put("articles", newsArtiList);
        dataMap.put("news", dataNewsMap);
        return dataMap;
    }

    /**
     * 转换为markdown格式的消息map
     * 
     * @Title parse2MarkdownDataMap
     * @author 吕凯
     * @date 2020年7月6日 上午8:34:38
     * @param content
     *            内容，支持@某个人
     * @return Map<String,Object>
     */
    public static final Map<String, Object> parse2MarkdownDataMap(String content) {
        /*{
            "msgtype": "markdown",
            "markdown": {
                "content": "实时新增用户反馈<font color=\"warning\">132例</font>，请相关同事注意。\n
                 >类型:<font color=\"comment\">用户反馈</font>
                 >普通用户反馈:<font color=\"comment\">117例</font>
                 >VIP用户反馈:<font color=\"comment\">15例</font>"
            }
        }*/
        /*参数    是否必填    说明
        msgtype 是   消息类型，此时固定为markdown
        content 是   markdown内容，最长不超过4096个字节，必须是utf8编码*/

        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("msgtype", "markdown");

        Map<String, String> dataContentMap = new HashMap<>();
        dataContentMap.put("content", content);
        dataMap.put("markdown", dataContentMap);
        return dataMap;
    }

    /**
     * 转换为图片信息map
     * 
     * @Title parse2ImageDataMap
     * @author 吕凯
     * @date 2020年7月6日 上午8:43:24
     * @param base64Data
     *            图片的base64内容
     * @param md5
     *            图片的md5码
     * @return Map<String,Object>
     */
    public static final Map<String, Object> parse2ImageDataMap(String base64Data, String md5) {
        /*{
            "msgtype": "image",
            "image": {
                "base64": "DATA",
                "md5": "MD5"
            }
        }*/
        /*参数    是否必填    说明
        msgtype 是   消息类型，此时固定为image
        base64  是   图片内容的base64编码
        md5 是   图片内容（base64编码前）的md5值*/

        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("msgtype", "image");

        Map<String, String> dataContentMap = new HashMap<>();
        dataContentMap.put("base64", base64Data);
        dataContentMap.put("md5", md5);
        dataMap.put("image", dataContentMap);
        return dataMap;
    }

    /**
     * 
     * 转换为图片信息map
     * 
     * @Title parse2ImageDataMap
     * @author 吕凯
     * @date 2020年7月6日 上午10:10:45
     * @param file
     * @return Map<String,Object>
     */
    public static final Map<String, Object> parse2ImageDataMap(File file) {
        String base64Data = FileUtils.convertFile2Base64(file);
        String md5 = FileUtils.getFileMD5Hex(file);
        return parse2ImageDataMap(base64Data, md5);
    }

    /**
     * 转换为图片信息map
     * 
     * @Title parse2ImageDataMap
     * @author 吕凯
     * @date 2020年7月6日 上午10:10:26
     * @param filePath
     *            文件路径
     * @return Map<String,Object>
     */
    public static final Map<String, Object> parse2ImageDataMap(String filePath) {
        String base64Data = FileUtils.convertFile2Base64(filePath);
        String md5 = FileUtils.getFileMD5Hex(filePath);
        return parse2ImageDataMap(base64Data, md5);
    }

    /**
     * 转换为图片信息map
     * 
     * @Title parse2ImageDataMap
     * @author 吕凯
     * @date 2020年7月6日 上午10:10:16
     * @param urlpath
     * @return Map<String,Object>
     */
    public static final Map<String, Object> parse2ImageDataMap(URL urlpath) {
        String base64Data = FileUtils.convertFile2Base64(urlpath);
        String md5 = FileUtils.getFileMD5Hex(urlpath);
        return parse2ImageDataMap(base64Data, md5);
    }

    public static void main(String[] args) {
//        Map<String, Object> dataMap = parse2ImageDataMap("D:\\图片视频\\092002.92725844_620X620.jpg");
        Map<String, Object> dataMap;
        try {
//            dataMap = parse2ImageDataMap(new URL("https://s1.ax1x.com/2020/07/02/Nb5hb4.png")); //图片信息
//            dataMap = parse2TextDataMap("测试@全部", true); //@全体
//            dataMap = parse2TextDataMap("测试@某个人", "LvKai", null); // 用户id@用户
//            dataMap = parse2TextDataMap("测试@某个人", null, "15253640441"); //手机号@用户
            dataMap = parse2TextDataMap("测试在内容中@某个人，sho<@LvKai>123"); // 内容中@用户，<@userId>
//            dataMap = parse2TextDataMap("测试@某个人", null, "15253640441,@all"); //逗号连接，@多个人

            String key = PropertiesModel.CONFIG.getString("notice.ewechatbot.client-secret");
            String url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + key;
            String userAgent = "kevin";
            System.out.println(JsoupUtil.sendJson(dataMap, url, userAgent, 3000));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
